package com.gxy.learn.design.model.create.singleton;

import java.io.Serializable;

/**
 * @description: 单例 懒汉式
 * 静态内部类单例模式中实例由内部类创建，由于VM在加载外部类的过程中，是不会加载静态内部类的，只有内部类的属性/方法被调用时才会被加载，并初始化其静态属性。
 * 静态属性由于被 static 修饰，保证只被实例化一次，并且严格保证实例化顺序。
 * <p>
 * 用来测试实现序列化接口后进行反射调用时会不会破坏单例
 * @author: gaoxueyong
 * @Date: 2022/11/6 17:07
 */
public class SingletonSluggardStaticInvokeSerializable implements Serializable {
    private static boolean flag = false;

    private SingletonSluggardStaticInvokeSerializable() {
        synchronized (SingletonSluggardStaticInvokeSerializable.class) {

            //        判断flag是否是true  true说明不是第一次访问，false代表第一次访问
            if (flag) {
                throw new RuntimeException("不能创建多个对象！");
            }
            flag = true;
        }
    }

    private volatile static SingletonSluggardStaticInvokeSerializable instance;

    public static SingletonSluggardStaticInvokeSerializable getInstance() {
        if (null == instance) {
            synchronized (SingletonSluggardDcl.class) {
                if (null == instance) {
                    instance = new SingletonSluggardStaticInvokeSerializable();
                }
            }
        }
        return instance;
    }
}
